home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 173 / 173.xpi / chrome / gm-notifier.jar / content / gm-notifier / gm-accounts.xul < prev    next >
Extensible Markup Language  |  2009-09-28  |  20KB  |  501 lines

  1. <?xml version="1.0"?>
  2. <?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
  3. <?xml-stylesheet href="chrome://gm-notifier/content/gm-notifier.css" type="text/css"?>
  4.  
  5. <!DOCTYPE dialog SYSTEM "chrome://gm-notifier/locale/gm-notifier.dtd">
  6. <dialog xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
  7.         title="¬ifier.accounts.window.title;"
  8.         windowtype="gm-notifier:accounts"
  9.         buttons="accept"
  10.         style="padding:0px; margin:0px;"
  11.         ondialogaccept="onUnload()" ondialogcancel="onUnload()"
  12.         onunload="onUnload()" onload="start()">
  13.  
  14.   <script type="application/x-javascript" src="chrome://gm-notifier/content/gm-prefs.js"/>
  15.   <script>
  16.     <![CDATA[
  17.       const kPSWDMANAGER_CONTRACTID = "@mozilla.org/passwordmanager;1";
  18.       const nsIPasswordManager = Components.interfaces.nsIPasswordManager;
  19.       const nsIPasswordManagerInternal = Components.interfaces.nsIPasswordManagerInternal;
  20.       const nsIGMNotifierProgressListener = Components.interfaces.nsIGMNotifierProgressListener;
  21.  
  22.       var gPrefs;
  23.       var gHost = "chrome://gm-notifier/";
  24.       var gCurrentUser;
  25.  
  26.       var gNotifierService = null;
  27.       var gNotifierProgressListener = null;
  28.  
  29.       // 1: Edit, 2: New
  30.       var gMode;
  31.  
  32.       function start() {
  33.         gNotifierService = Components.classes["@mozilla.org/GMailNotifier;1"].getService(Components.interfaces.nsIGMNotifierService);
  34.  
  35.         // register listener
  36.         gNotifierProgressListener = new NotifierProgressListener();
  37.         gNotifierService.addListener(gNotifierProgressListener);
  38.  
  39.         gPrefs = new gm_prefs();
  40.  
  41.         toogleEditFields(false);
  42.         prefillAccounts();
  43.       }
  44.  
  45.       var NotifierProgressListener = function() {
  46.         return ({
  47.           getID : function () { return null; },
  48.  
  49.           onStateChange : function (aUsername, aState) {
  50.             var elm = document.getElementById("userstatus-"+aUsername);
  51.             if (!elm)
  52.               return;
  53.  
  54.             var string = "";
  55.  
  56.             if (aState == nsIGMNotifierProgressListener.LOGIN_INITIATED) {
  57.               string = getStringFromBundle("UserStateConnecting");
  58.             } else if (aState == nsIGMNotifierProgressListener.LOGIN_FAILED || aState == nsIGMNotifierProgressListener.LOGIN_DETAILS_INVALID || aState == nsIGMNotifierProgressListener.LOGIN_SUCCESS || aState == nsIGMNotifierProgressListener.LOGOUT_USER) {
  59.               var state = gNotifierService.getUserState(aUsername);
  60.               string = getStringForState(state);
  61.  
  62.               if (aState == nsIGMNotifierProgressListener.LOGIN_SUCCESS)
  63.                 document.getElementById("loggedin-"+aUsername).checked = true;
  64.               else
  65.                 document.getElementById("loggedin-"+aUsername).checked = false;
  66.             }
  67.  
  68.             if (string)
  69.               elm.setAttribute("value", string);
  70.           },
  71.  
  72.           QueryInterface : function(aIID) {
  73.             if (aIID.equals(nsIGMNotifierProgressListener) ||
  74.                 aIID.equals(Components.interfaces.nsISupports))
  75.               return this;
  76.             throw Components.results.NS_NOINTERFACE;
  77.           }
  78.         });
  79.       }
  80.  
  81.       function toogleEditFields(aEnabled) {
  82.         document.getElementById("username").disabled = !aEnabled;
  83.         document.getElementById("password").disabled = !aEnabled;
  84.         document.getElementById("autologin").disabled = !aEnabled;
  85.         document.getElementById("label1").disabled = !aEnabled;
  86.         document.getElementById("label2").disabled = !aEnabled;
  87.         document.getElementById("save-button").disabled = true;
  88.       }
  89.  
  90.       function setupEditFields(aItem) {
  91.         var username = "", password = "", autologin = false;
  92.         if (aItem) {
  93.           username = aItem.firstChild.getAttribute("label");
  94.           password = gPasswordArray[username];
  95.           autologin = aItem.childNodes[2].firstChild.checked;
  96.         }
  97.  
  98.         gCurrentUser = username;
  99.  
  100.         document.getElementById("username").value = username;
  101.         document.getElementById("password").value = password;
  102.         document.getElementById("autologin").checked = autologin;
  103.  
  104.         gMode = 1;
  105.       }
  106.  
  107.       function selectionChanged(aListbox) {
  108.         var selectedItem = aListbox.selectedItem;
  109.         toogleEditFields(selectedItem ? true : false);
  110.         setupEditFields(selectedItem);
  111.  
  112.         document.getElementById("removeButton").setAttribute("disabled", !selectedItem);
  113.       }
  114.  
  115.       var gPasswordArray = new Array();
  116.  
  117.       function getPassword(aUsername) {
  118.         if (Components.classes["@mozilla.org/login-manager;1"]) {
  119.           var passwordManager = Components.classes["@mozilla.org/login-manager;1"].getService(Components.interfaces.nsILoginManager);
  120.           var logins = passwordManager.findLogins({}, gHost, null, "gm-notifier");
  121.  
  122.           for (var i = 0; i < logins.length; i++) {
  123.             if (logins[i].username == aUsername) {
  124.               var password = logins[i].password;
  125.               // XXX: why not call the service here to get password?
  126.               if (password === " ") {
  127.                 // XXX: empty password is " " for now due to ff3 change
  128.                 return "";
  129.               } else {
  130.                 return password;
  131.               }
  132.             }
  133.           }
  134.         } else {
  135.           var passwordManager = Components.classes["@mozilla.org/passwordmanager;1"].createInstance(Components.interfaces.nsIPasswordManagerInternal);
  136.           var host = {value:""};
  137.           var user =  {value:""};
  138.           var password = {value:""}; 
  139.  
  140.           try {
  141.             passwordManager.findPasswordEntry(gHost, aUsername, "", host, user, password);
  142.           } catch(e){ }
  143.  
  144.           return password.value;
  145.         }
  146.       }
  147.  
  148.       function prefillAccounts() {
  149.         var user, password, state;
  150.         var userlist = document.getElementById("userlist");
  151.  
  152.         var count = gNotifierService.getUserCount();
  153.  
  154.         for (var i = 0; i < count; i++) {
  155.           user = gNotifierService.getUserName(i);
  156.           password = getPassword(user);
  157.           state = gNotifierService.getUserState(user);
  158.  
  159.           gPasswordArray[user] = password;
  160.  
  161.           // check user prefs
  162.           var autologin = gPrefs.getBoolPref("gm-notifier.userlist." + user + ".autologin");
  163.           var loggedin = (state == gNotifierService.USER_STATE_LOGGED_IN);
  164.  
  165.           userlist.appendChild(createListItem(user, autologin, loggedin, state));
  166.         }
  167.       }
  168.  
  169.       function createListItem(aUsername, aAutoLogin, aIsLoggedIn, aState) {
  170.         var listitem = document.createElement("listitem");
  171.         listitem.setAttribute("allowevents", "true");
  172.  
  173.         var listcell = document.createElement("listcell");
  174.         listcell.setAttribute("label", aUsername);
  175.         listitem.appendChild(listcell);
  176.  
  177.         listcell = document.createElement("listcell");
  178.         listcell.setAttribute("pack", "center");
  179.         var checkbox = document.createElement("checkbox");
  180.         checkbox.setAttribute("id", "loggedin-"+aUsername);
  181.         checkbox.setAttribute("oncommand", "loggedinChanged(this, \""+aUsername+"\")");
  182.         checkbox.setAttribute("checked", (aIsLoggedIn == null ? false : aIsLoggedIn));
  183.         listcell.appendChild(checkbox);
  184.         listitem.appendChild(listcell);
  185.  
  186.         listcell = document.createElement("listcell");
  187.         listcell.setAttribute("pack", "center");
  188.         checkbox = document.createElement("checkbox");
  189.         checkbox.setAttribute("oncommand", "autologinChanged(this, \""+aUsername+"\")");
  190.         checkbox.setAttribute("checked", (aAutoLogin == null ? false : aAutoLogin));
  191.         listcell.appendChild(checkbox);
  192.         listitem.appendChild(listcell);
  193.  
  194.         listcell = document.createElement("listcell");
  195.         var label = document.createElement("label");
  196.         label.setAttribute("value", getStringForState(aState));
  197.         label.setAttribute("id", "userstatus-"+aUsername);
  198.         listcell.appendChild(label);
  199.         listitem.appendChild(listcell);
  200.  
  201.         return listitem;
  202.       }
  203.  
  204.       function getStringFromBundle(aName) {
  205.         var strbundle = document.getElementById("stringbundle");
  206.         return strbundle.getString(aName);
  207.       }
  208.  
  209.       function getStringForState(aState) {
  210.         var value = "";
  211.  
  212.         if (aState == gNotifierService.USER_STATE_LOGGED_IN) {
  213.           value = getStringFromBundle("LoggingStatusLoggedIn");
  214.         } else if (aState == gNotifierService.USER_STATE_LOGGED_OUT) {
  215.           value = getStringFromBundle("UserStateLoggedOut");
  216.         } else if (aState == gNotifierService.USER_STATE_INVALID_DETAILS) {
  217.           value = getStringFromBundle("UserStateInvalidDetails");
  218.         }
  219.  
  220.         return value;
  221.       }
  222.  
  223.       function deleteAccount() {
  224.         var userlist = document.getElementById("userlist");
  225.         if (!userlist.selectedItem)
  226.           return;
  227.  
  228.         var username = userlist.selectedItem.firstChild.getAttribute("label");
  229.         var shouldDelete = confirm("Are you sure you want to delete the account \"" + username + "\"?");
  230.  
  231.         if (shouldDelete) {
  232.           deleteUsername(username);
  233.  
  234.           userlist.removeItemAt(userlist.selectedIndex)
  235.           gPasswordArray[username] = null;
  236.           deleteUsername(username);
  237.           gPrefs.clearPref("gm-notifier.userlist." + username + ".autologin");
  238.           gPrefs.clearPref("gm-notifier.userlist." + username + ".loggedin");
  239.         }
  240.       }
  241.  
  242.       function deleteUsername(aUsername) {
  243.         try {
  244.           if (Components.classes["@mozilla.org/login-manager;1"]) {
  245.             var passwordManager = Components.classes["@mozilla.org/login-manager;1"].getService(Components.interfaces.nsILoginManager);
  246.             var passwords = passwordManager.findLogins({}, gHost, null, "gm-notifier");
  247.  
  248.             for (var i = 0; i < passwords.length; i++) {
  249.               if (passwords[i].username == aUsername) {
  250.                 passwordManager.removeLogin(passwords[i]);
  251.                 break;
  252.               }
  253.             }
  254.  
  255.           } else {
  256.             var passwordManager = Components.classes[kPSWDMANAGER_CONTRACTID]
  257.                                .createInstance(nsIPasswordManager);
  258.             passwordManager.removeUser(gHost, aUsername);
  259.           }
  260.         } catch (e) {}
  261.  
  262.         gNotifierService.removeUser(aUsername);
  263.       }
  264.  
  265.       function addUsername(aUsername, aPassword) {
  266.         try {
  267.           if (Components.classes["@mozilla.org/login-manager;1"]) {
  268.             var logininfo = Components.classes["@mozilla.org/login-manager/loginInfo;1"].createInstance(Components.interfaces.nsILoginInfo);
  269.             var passwordManager = Components.classes["@mozilla.org/login-manager;1"].getService(Components.interfaces.nsILoginManager);
  270.  
  271.             logininfo.init(gHost, null, "gm-notifier", aUsername, aPassword, "", "");
  272.             passwordManager.addLogin(logininfo);
  273.           } else {
  274.             var passwordManager = Components.classes[kPSWDMANAGER_CONTRACTID]
  275.                                .createInstance(nsIPasswordManager);
  276.             passwordManager.addUser(gHost, aUsername, aPassword);
  277.           }
  278.         } catch (e) {}
  279.       }
  280.  
  281.       function updatePassword(aUsername, aPassword) {
  282.         try {
  283.           if (Components.classes["@mozilla.org/login-manager;1"]) {
  284.             var loginManager = Components.classes["@mozilla.org/login-manager;1"].getService(Components.interfaces.nsILoginManager);
  285.             var passwords = loginManager.findLogins({}, gHost, null, "gm-notifier");
  286.  
  287.             for (var i = 0; i < passwords.length; i++) {
  288.               if (passwords[i].username == aUsername) {
  289.                 var logininfo = Components.classes["@mozilla.org/login-manager/loginInfo;1"].createInstance(Components.interfaces.nsILoginInfo);
  290.                 logininfo.init(gHost, null, "gm-notifier", aUsername, aPassword, "", "");
  291.                 loginManager.modifyLogin(passwords[i], logininfo);
  292.                 break;
  293.               }
  294.             }
  295.           } else {
  296.             var passwordManager = Components.classes[kPSWDMANAGER_CONTRACTID]
  297.                                .createInstance(nsIPasswordManager);
  298.             try {
  299.               passwordManager.removeUser(gHost, aUsername);
  300.             } catch (e) {}
  301.  
  302.             passwordManager.addUser(gHost, aUsername, aPassword);
  303.           }
  304.         } catch (e) {}
  305.       }
  306.  
  307.       function addUser() {
  308.         toogleEditFields(true);
  309.         setupEditFields();
  310.  
  311.         // disable save button untill all data is there
  312.         document.getElementById("save-button").disabled = true;
  313.  
  314.         // focus the username field
  315.         document.getElementById("username").focus();
  316.         gMode = 2;
  317.       }
  318.  
  319.       function updateSaveButton() {
  320.         // check if username/password ain't empty
  321.         var username = document.getElementById("username").value;
  322.         var password = document.getElementById("password").value;
  323.  
  324.         if (username.length > 0 && password.length > 0)
  325.           document.getElementById("save-button").disabled = false;
  326.         else
  327.           document.getElementById("save-button").disabled = true;
  328.       }
  329.  
  330.       function doSaveUser() {
  331.         var userlist = document.getElementById("userlist");
  332.         var username = document.getElementById("username").value;
  333.         var password = document.getElementById("password").value;
  334.         var autologin = document.getElementById("autologin").checked;
  335.  
  336.         // 1: Edit, 2: New
  337.         if (gMode == 1) {
  338.           // check if the username changed
  339.           if (username != gCurrentUser) {
  340.             // check if the username already exists
  341.             if (gPasswordArray[username]) {
  342.               alert("User \"" + username + "\" already exists!")
  343.               return;
  344.             }
  345.  
  346.             // delete old user
  347.             deleteUsername(gCurrentUser);
  348.             gPasswordArray[gCurrentUser] = null;
  349.  
  350.             gPrefs.clearPref("gm-notifier.userlist." + gCurrentUser + ".autologin");
  351.             gPrefs.clearPref("gm-notifier.userlist." + gCurrentUser + ".loggedin");
  352.           }
  353.  
  354.           // update user
  355.           updatePassword(username, password);
  356.           gPasswordArray[username] = password;
  357.  
  358.           gPrefs.setBoolPref("gm-notifier.userlist." + username + ".autologin", autologin);
  359.           gPrefs.setBoolPref("gm-notifier.userlist." + username + ".loggedin", false);
  360.  
  361.           userlist.selectedItem.firstChild.setAttribute("label", username);
  362.           userlist.selectedItem.childNodes[2].firstChild.setAttribute("checked", autologin);
  363.  
  364.           // XXX: what if user is logged in?
  365.         } else if (gMode == 2) {
  366.           // check if username exists
  367.           if (gPasswordArray[username]) {
  368.             alert("User \"" + username + "\" already exists!")
  369.             return;
  370.           }
  371.  
  372.           // add user to the password manager
  373.           addUsername(username, password);
  374.           gPasswordArray[username] = password;
  375.  
  376.           // set per-account preference
  377.           gPrefs.setBoolPref("gm-notifier.userlist." + username + ".autologin", autologin);
  378.           gPrefs.setBoolPref("gm-notifier.userlist." + username + ".loggedin", false);
  379.  
  380.           userlist.appendChild(createListItem(username, autologin, false, gNotifierService.USER_STATE_LOGGED_OUT));
  381.           userlist.selectedIndex = userlist.getRowCount() - 1;
  382.  
  383.           gNotifierService.addUser(username);
  384.         }
  385.  
  386.         // saved, so disable button
  387.         document.getElementById("save-button").disabled = true;
  388.       }
  389.  
  390.       function autologinChanged(aCheckbox, aUsername) {
  391.         // force selection
  392.         document.getElementById("userlist").selectedItem = aCheckbox.parentNode.parentNode;
  393.         document.getElementById("autologin").checked = aCheckbox.checked;
  394.  
  395.         // save
  396.         doSaveUser();
  397.       }
  398.  
  399.       function loggedinChanged(aCheckbox, aUsername) {
  400.         if (aCheckbox.checked) {
  401.           // since the accounts window can be opened from the prefs window by
  402.           // the user by checking the multi-account checkbox (which won't change
  403.           // the underlying pref untill you press ok on that page), we make sure
  404.           // that the multi-account pref is true when we log in a user.
  405.           if (!gPrefs.getBoolPref("gm-notifier.multiaccount.enabled")) {
  406.             gPrefs.setBoolPref("gm-notifier.multiaccount.enabled", true);
  407.           }
  408.  
  409.           gNotifierService.loginUser(aUsername);
  410.         } else {
  411.           gNotifierService.logoutUser(aUsername);
  412.         }
  413.       }
  414.  
  415.       function onDestroy() {
  416.         onUnload();
  417.         window.close();
  418.       }
  419.  
  420.       function onUnload() {
  421.         // unregister listener
  422.         if (gNotifierProgressListener)
  423.           gNotifierService.removeListener(gNotifierProgressListener);
  424.  
  425.         // cleanup
  426.         gNotifierProgressListener = null;
  427.         gNotifierService = null;
  428.         gPrefs = null;
  429.       }
  430.     ]]>
  431.   </script>
  432.  
  433.   <stringbundle id="stringbundle" src="chrome://gm-notifier/locale/gm-notifier.properties"/>
  434.  
  435.   <description value="¬ifier.accounts.window.title;" class="notifier-dialog-title"
  436.                style="min-width:400px; margin-bottom: 10px;"/>
  437.  
  438.   <hbox flex="1">
  439.     <vbox flex="1">
  440.       <listbox id="userlist" flex="1" onselect="selectionChanged(this)">
  441.         <listhead>
  442.           <listheader label="¬ifier.accounts.listheader.username.label;"/>
  443.           <listheader label="¬ifier.accounts.listheader.online.label;"/>
  444.           <listheader label="¬ifier.accounts.listheader.autologin.label;"/>
  445.           <listheader label="¬ifier.accounts.listheader.status.label;"/>
  446.         </listhead>
  447.         <listcols>
  448.           <listcol flex="10"/>
  449.           <listcol flex="1"/>
  450.           <listcol flex="1"/>
  451.           <listcol flex="1"/>
  452.         </listcols>
  453.       </listbox>
  454.  
  455.       <groupbox>
  456.         <caption label="¬ifier.accounts.groupbox.label;"/>
  457.         <grid flex="1">
  458.           <columns>
  459.             <column/>
  460.             <column flex="1"/>
  461.           </columns>
  462.           <rows>
  463.             <row align="center">
  464.               <label id="label1"
  465.                      value="¬ifier.accounts.grid.username.label;"
  466.                      accesskey="¬ifier.accounts.grid.username.accesskey;"
  467.                      control="username"/>
  468.               <textbox onkeyup="updateSaveButton()" id="username" tabindex="1"/>
  469.  
  470.               <button id="save-button" icon="save"
  471.                       label="¬ifier.accounts.grid.username.save.label;"
  472.                       accesskey="¬ifier.accounts.grid.username.save.accesskey;"
  473.                       oncommand="doSaveUser()" tabindex="4"/>
  474.             </row>
  475.             <row align="center">
  476.               <label id="label2"
  477.                      value="¬ifier.accounts.grid.username.password.label;"
  478.                      accesskey="¬ifier.accounts.grid.username.password.accesskey;"
  479.                      control="password"/>
  480.               <textbox id="password" onkeyup="updateSaveButton()" type="password" tabindex="2"/>
  481.             </row>
  482.             <checkbox id="autologin" 
  483.                       label="¬ifier.accounts.grid.autologin.label;"
  484.                       accesskey="¬ifier.accounts.grid.autologin.accesskey;"
  485.                       tabindex="3"/>
  486.           </rows>
  487.         </grid>
  488.       </groupbox>
  489.     </vbox>
  490.     <vbox>
  491.       <button label="¬ifier.accounts.buttons.add.label;"
  492.               accesskey="¬ifier.accounts.buttons.add.accesskey;"
  493.               icon="add" oncommand="addUser()"/>
  494.       <button label="¬ifier.accounts.buttons.remove.label;"
  495.               id="removeButton" disabled="true"
  496.               accesskey="¬ifier.accounts.buttons.remove.accesskey;"
  497.               icon="remove" oncommand="deleteAccount()"/>
  498.     </vbox>
  499.   </hbox>
  500. </dialog>
  501.